home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].zip / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].po / TEXT.CRUNCH.S < prev    next >
Text File  |  1996-12-24  |  4KB  |  183 lines

  1. ********************************
  2. *      TEXT.CRUNCH Source Code *
  3. *      by Howard Huang         *
  4. *      Copyright (c) 1985      *
  5. *      by MicroSPARC, Inc.     *
  6. *      Concord, MA 01742       *
  7. *                              *
  8. *      Assembler: MERLIN       *
  9. ********************************
  10.           ORG $6000
  11.  
  12. *
  13. * --> Equates
  14. *
  15.  
  16. DONE      = $0           ;Flag for last letter
  17. TEMP      = $2           ;Temporary storage
  18. COUNTER   = $3           ;Counter for groups of chars
  19. ALLFLAG   = $4           ;Include lowercase?
  20. CODE      = $6           ;Text buffer address
  21. TEXT      = $8           ;Text to be crunched
  22. LEFT      = $A           ;Shift left counter
  23. RIGHT     = $B           ;Shift right counter
  24.  
  25. *==============
  26. * PROGRAM START
  27. *==============
  28.  
  29. *
  30. * --> Initialize
  31. *
  32.  
  33. CRUNCH    LDY #$FF
  34.           STY DONE       ;Reset DONE flag
  35.           INY
  36.           LDA ALLFLAG
  37.           BNE ALLCHARS   ;If ALLFLAG = 1, do lowercase
  38.  
  39. *======================
  40. * CRUNCH UPPERCASE ONLY
  41. *======================
  42.  
  43. BEGIN     LDA #1
  44.           STA COUNTER    ;First char in 4-char group
  45.           LDA (TEXT),Y
  46.           BNE UPPERC     ;Not end yet
  47.           JMP QUIT1      ;Exit
  48.  
  49. UPPERC    LDA (TEXT),Y   ;Get character
  50.           LDX COUNTER
  51.           AND MASK1-1,X  ;Erase unwanted bits
  52.           PHA
  53.           TXA
  54.           ASL
  55.           STA LEFT       ;Number of times to shift
  56.           PLA
  57.           JSR MOVELEFT   ;Go ahead and ASL
  58.  
  59.           JSR INCTEXT    ;Get next character
  60.           LDX COUNTER
  61.           AND MASK2-1,X  ;Erase some bits
  62.           PHA
  63.           LDA #3
  64.           SEC
  65.           SBC COUNTER
  66.           ASL
  67.           STA RIGHT      ;How many times to shift right
  68.           PLA
  69.           JSR MOVERGHT   ;Shift rightwards
  70.  
  71.           JSR COMBINE    ;Form an encoded byte
  72.           INC COUNTER    ;Next char
  73.           LDA COUNTER
  74.           CMP #4
  75.           BNE UPPERC     ;Still in same group of 4
  76.           JSR INCTEXT    ;Start another group
  77.           JMP BEGIN      ;Do next group
  78.  
  79. *
  80. * --> Table of MASKS
  81. *
  82.  
  83. MASK1     DFB $3F,$0F,$03
  84. MASK2     DFB $3F,$3C,$3F
  85.  
  86.  
  87. *============================
  88. * CRUNCH UPPER AND LOWER CASE
  89. *============================
  90.  
  91. ALLCHARS  LDA #1
  92.           STA LEFT
  93.           LDA #6
  94.           STA RIGHT      ;Set initial values
  95.           LDA #7
  96.           STA COUNTER    ;Do 8 character group
  97.           LDA (TEXT),Y
  98.           BEQ QUIT1      ;No more text
  99.  
  100. DOONE     LDA (TEXT),Y   ;Get char
  101.           JSR MOVELEFT   ;Shift leftwards
  102.           JSR INCTEXT1   ;Get next char
  103.           JSR MOVERGHT   ;Move rightwards
  104.           JSR COMBINE    ;Form encoded byte
  105.  
  106.           INC LEFT
  107.           DEC RIGHT      ;Prepare for next char
  108.           DEC COUNTER
  109.           BNE DOONE      ;Still in same group
  110.           JSR INCTEXT1   ;Get first char of next group
  111.           JMP ALLCHARS   ;Crunch next group
  112.  
  113.  
  114. *============
  115. * SUBROUTINES
  116. *============
  117.  
  118. *
  119. * --> Shift bits to the right
  120. *
  121.  
  122. MOVERGHT  LDX RIGHT
  123. RGHT:1    BEQ ENDRIGHT   ;No more shifting
  124.           LSR            ;Shift
  125.           DEX
  126.           JMP RGHT:1
  127. ENDRIGHT  RTS
  128.  
  129. *
  130. * --> Shift bits to the left and save result
  131. *
  132.  
  133. MOVELEFT  LDX LEFT
  134. LEFT:1    BEQ ENDLEFT
  135.           ASL
  136.           DEX
  137.           JMP LEFT:1
  138. ENDLEFT   STA TEMP       ;Save the result
  139.           RTS
  140.  
  141. *
  142. * --> Increment TEXT for uppercase routine
  143. *
  144.  
  145. INCTEXT   INC TEXT       ;Push up
  146.           BNE INCRET
  147.           INC TEXT+1     ;Next page
  148. INCRET    LDA (TEXT),Y   ;Get character
  149.           STA DONE
  150.           RTS
  151.  
  152. *
  153. * --> Increment TEXT for lowercase routine
  154. *
  155.  
  156. INCTEXT1  JSR INCTEXT
  157.           AND #$7F       ;Erase first bit
  158.           RTS
  159.  
  160. *
  161. * --> Combine bytes to form one encoded byte
  162. *
  163.  
  164. COMBINE   ORA TEMP       ;Combine
  165.           STA (CODE),Y   ;Save
  166.           INC CODE       ;Next memory location
  167.           BNE RETURN
  168.           INC CODE+1     ;Next page
  169. RETURN    LDA DONE
  170.           BEQ QUIT       ;No more to crunch
  171.           RTS
  172.  
  173. *
  174. * --> End crunching
  175. *
  176.  
  177. QUIT      PLA
  178.           PLA            ;Pull off call
  179. QUIT1     LDA #0
  180.           STA (CODE),Y   ;Zero last byte
  181.           RTS
  182.           LST OFF
  183.